home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
EnigmA Amiga Run 1996 March
/
EnigmA AMIGA RUN 05 (1996)(G.R. Edizioni)(IT)[!][issue 1996-03][Skylink CD IV].iso
/
earcd
/
util2
/
fiflb381.lha
/
handler.h
< prev
next >
Wrap
C/C++ Source or Header
|
1995-12-14
|
6KB
|
214 lines
/*
* HANDLER.H
*/
#include <exec/types.h>
#include <exec/nodes.h>
#include <exec/ports.h>
#include <exec/interrupts.h>
#include <exec/memory.h>
#include <exec/alerts.h>
#include <exec/libraries.h>
#include <dos/dos.h>
#include <dos/dosextens.h>
#include <dos/filehandler.h>
#include <devices/timer.h>
#include <libraries/fifo.h>
#if defined(_DCC) /* at least the very old DICE 2.06 */
#include <clib/dos_protos.h>
#include <clib/exec_protos.h>
#include <clib/alib_protos.h>
#else /* proto/ will include inline/ if optimization is on in GCC */
#include <proto/dos.h>
#include <proto/exec.h>
#include <proto/alib.h>
#endif
#include <proto/fifo.h>
#ifdef DEBUG
#include <stdio.h> /* vsprintf() */
#include <stdarg.h> /* for xprintf() */
#endif
#include <stdlib.h>
#include <string.h>
#ifdef _DCC
/*#include <lib/requestfh.h>*/ /* what was this? */
#endif
#if defined(__GNUC__)
#if 0
#include <inline/strsup.h> /* inline strlen() etc. */
#else
/* We can make GCC generate nice code! */
extern __inline__ int strlen(const char *string)
{
const char *s=string;
while(*s++) ; /* tstb a0@+; bne 0b */
return ~(string-s);
}
/* Do not use this inline for strcpy(foo, "...") which is optimized away */
extern __inline__ char *strcpy(char *d, const char *s)
{
char *d2 = d;
/*
* GCC would generate "0: moveb a@+,d0; move d0,a@+, jne 0b" instead
*/
__asm__ volatile ("0: moveb %0@+,%1@+; jne 0b"
: "=a" (s), "=a" (d) : "0" (s), "1" (d) : "cc", "memory");
return d2;
}
/*
* GCC-1.x, 2.3.3, 2.5.8, 2.6.3, 2.7.0 uses dbra
* in such while((short|long)(--n) != -1) loops
* Other loops forms may not lead to the same optimization with all GCCs
* short count generates single dbra, long count dbra in the inner loop
*/
extern __inline__ char *strscpy(char *d, const char *s, short n)
{
char *d2 = d;
if (n) {
--n;
/* 0: moveb a0@+,d0; (grr) moveb d0,a0@+; beq 1f; dbra d0,0b; 1: */
while ((*d++=*s++) && ((short)(--n) != -1)) ;
}
return d2;
}
/* short is enough for fifo-handler */
#define strncpy strscpy
#if 1
#define memscpy(d,s,scount) \
({ void *__memscpy_d = (d); \
void *__memscpy_s = (s); \
short __memscpy_scount = (scount); \
void *__memscpy_res = __memscpy_d; \
if (!(__memscpy_scount==0)) { \
--__memscpy_scount; \
do { *(char*)__memscpy_d++ = *(char*)__memscpy_s++; } \
while ((short)(--__memscpy_scount)!=-1); \
} \
__memscpy_res; \
})
#else
extern __inline__ void *memscpy(void *d, void *s, short scount)
{
void *d2 = d;
if (scount) {
--scount;
do { *(char *)d++ = *(char *)s++; }
while ((short)(--scount)!=-1);
}
return d2;
}
#endif
/*
* We know this is safe because: 1st count is small,
* 2nd this memscpy() can still copy overlapping memory to
* lower addresses and this is exactly what fifo-handler needs
*/
#define memmove(d,s,count) memscpy(d,s,count)
/*
* Alternative:
* defines, not inline functions, work even without optimization
* work even better than inline function with optimization on
*/
/* BUG: wrong sign for chars > 127 */
#define streql(s1,s2) \
({ char *__streql_s1 = (s1), *__streql_s2 = (s2); \
char __streql_c1, __streql_c2; \
while (!(__streql_c1=*__streql_s1++ \
-(__streql_c2=*__streql_s2++)) \
&& __streql_c2) ; \
__streql_c1; \
})
/* the sign bug is not important, only 0 counts in fifo-handler */
#define strcmp(s1,s2) streql(s1,s2)
#endif
#endif
#ifndef memmove
#define memmove(to,from,count) bcopy(from,to,count)
#endif
#define Prototype extern
#define DOS_TRUE -1
#define DOS_FALSE 0
#define CB_SIZE 1024 /* lines buffer */
#define FIFO_SIZE 2048
#define BTOC(bptr) ((void *)((unsigned long)(bptr) << 2))
#define CTOB(cptr) ((BPTR)(((unsigned long)cptr) >> 2))
typedef struct DosPacket DosPacket;
typedef struct FileHandle FileHandle;
typedef struct DeviceNode DeviceNode;
typedef struct Process Process;
typedef struct MinNode Node;
typedef struct MinList List;
typedef struct Node MaxNode;
typedef struct List MaxList;
typedef struct MsgPort MsgPort;
typedef struct Message Message;
typedef struct Interrupt Interrupt;
typedef struct DosList DosList;
typedef struct RootNode RootNode;
typedef struct DosInfo DosInfo;
typedef struct SharRead {
void *sr_FifoR;
long sr_Refs;
} SharRead;
typedef struct FHan {
MaxNode ff_Node; /* fifo node, ln_name holds fifo name */
short ff_Flags;
short ff_Refs; /* open refs */
SharRead *ff_SRead; /* fifo handle for reading */
void *ff_FifoW; /* fifo handle for writing */
long ff_FHBufSiz;/* FifoW half buffer size */
Message ff_RdMsg;
Message ff_WrMsg;
MsgPort *ff_Port; /* unique port for messages */
List ff_RdWait;
List ff_WrWait;
char *ff_CookBuf;/* cooked buffer handling */
short ff_CookIdx;
short ff_LRet;
MsgPort *ff_SigPort;/* message port instead of task to signal */
} FHan;
#define ff_FifoR ff_SRead->sr_FifoR
#define FHF_COOKED 0x0001
#define FHF_RPEND 0x0002
#define FHF_WAVAIL 0x0004
#define FHF_READ 0x0008
#define FHF_WRITE 0x0010
#define FHF_CLOSEEOF 0x0020
#define FHF_MASTER 0x0040
#define FHF_TEE 0x0080
#define FHF_SHELL 0x0100
#define FHF_COOKBFUL 0x0200 /* cooked buffer is full */
#define FHF_COOKECHOBLK 0x0400 /* blocked echoing chars! */
#define FHF_REOF 0x0800 /* REMOTE EOF */
#define FHF_WIHOLD 0x1000 /* write hold due to input */
#define FHF_COOKCRLF 0x2000 /* need to write CRLF */
#define FHF_RREQUIRED 0x4000
typedef struct WaitTreq {
struct timerequest wt_timereq;
DosPacket *wt_packet;
} WaitTreq;
/* Were Protoize used
#include "fifohan-protos.h"
*/